/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package our.gui;

import java.awt.Container;
import java.text.DecimalFormat;
import java.text.NumberFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import javax.swing.JOptionPane;
import javax.swing.JPanel;

/**
 * Questa classe rappresenta il controllo JTextField customizzato
 * per le ns. esigenze.
 * @author keysman
 */
public class ourTextField extends javax.swing.JTextField implements ourInterfaceCommonObj {
    private boolean _KeyFrameFirstField = false; // Se è il primo elemento del keyframe
    private boolean _FirstFieldOutOfKeyFrame = false; // Se è il primo elemento fuori dal keyframe
    private our.gui.ourLabel _FieldShowObj = null; // ourLabel di show
    private int _FieldShowIdZoomCol = -1; // Id colonna dello zoom collegata al campo di show

    private boolean _IsZoomOnZoomEnabled = false;

    public boolean isIsZoomOnZoomEnabled() {
        return _IsZoomOnZoomEnabled;
    }

    public void setIsZoomOnZoomEnabled(boolean _IsZoomOnZoomEnabled) {
        this._IsZoomOnZoomEnabled = _IsZoomOnZoomEnabled;
    }

    public int getFieldShowIdZoomCol() {
        return _FieldShowIdZoomCol;
    }

    public void setFieldShowIdZoomCol(int _FieldShowIdZoomCol) {
        this._FieldShowIdZoomCol = _FieldShowIdZoomCol;
    }

    public ourLabel getFieldShowObj() {
        return _FieldShowObj;
    }

    public void setFieldShowObj(ourLabel _FieldShowObj) {
        this._FieldShowObj = _FieldShowObj;
    }
    public int getCharsInputAllowed() {
        return _CharsInputAllowed;
    }

    public void setCharsInputAllowed(int _CharsInputAllowed) {
        this._CharsInputAllowed = _CharsInputAllowed;
    }
    private int _CharsInputAllowed = 0; // Per default il tipo ammesso è numerico

    public boolean isFirstFieldOutOfKeyFrame() {
        return _FirstFieldOutOfKeyFrame;
    }

    public void setFirstFieldOutOfKeyFrame(boolean _FirstFieldOutOfKeyFrame) {
        this._FirstFieldOutOfKeyFrame = _FirstFieldOutOfKeyFrame;
    }
    private boolean _withStar = false;           // Se mostrare l'asterisco o meno

    public int getMaxTextLength() {
        return _MaxTextLength;
    }

    public void setMaxTextLength(int _MaxTextLength) {
        this._MaxTextLength = _MaxTextLength;
    }
    private int _MaxTextLength = 10; // Lunghezza massima del testo (default = 10 caratteri)

    private java.lang.String _FieldOnDB = "";    // Il nome del campo del db
    private java.lang.String _HelpMsg = "";      // Il messaggio che verrà visualizzato sulla StatusBar

    public String getHelpMsg() {
        return _HelpMsg;
    }

    public void setHelpMsg(String _HelpMsg) {
        this._HelpMsg = _HelpMsg;
    }
    public String getFieldOnDB() {
        return _FieldOnDB;
    }

    public void setFieldOnDB(String _FieldOnDB) {
        this._FieldOnDB = _FieldOnDB;
    }

    private java.lang.String _zoomOnClass = "";

    public String getZoomOnClass() {
        return _zoomOnClass;
    }

    public void setZoomOnClass(String _zoomOnClass) {
        this._zoomOnClass = _zoomOnClass;
    }

    public boolean isWithStar() {
        return _withStar;
    }

    public void setWithStar(boolean _withStar) {
        this._withStar = _withStar;
    }

    public boolean isKeyFrameFirstField() {
        return _KeyFrameFirstField;
    }

    public void setKeyFrameFirstField(boolean _KeyFrameFirstField) {
        this._KeyFrameFirstField = _KeyFrameFirstField;
    }


    // Definisco la classe che possiede le funzioni comuni a tutti gli oggetti a video
    public our.gui.commonObjectClass SETTINGS = new our.gui.commonObjectClass();

    // La seguente definizione serve per Windows ed evitare la gestione del get/lost focus
    //public static boolean AVOID_CHECK = false;

    private String CHARS_ARRAY[] = { "1234567890,.", 
                                     "1234567890", 
                                     "QWERTYUIOPASDFGHJKLZXCVBNM 1234567890qwertyuiopasdfghjklzxcvbnm,.:;-_àù#@èé[]*+ì^'?=)(/&%$£!|",
                                     "1234567890.",
                                     "QWERTYUIOPASDFGHJKLZXCVBNMqwertyuiopasdfghjklzxcvbnm",
                                     "QWERTYUIOPASDFGHJKLZXCVBNM1234567890",
                                     "1234567890",
                                     "01" };
    
    public static final int TYPE_NUMERIC  = 0;
    public static final int TYPE_DATA     = 1;
    public static final int TYPE_ALFANUM  = 2;
    public static final int TYPE_IP       = 3;
    public static final int TYPE_ONLYALFA = 4;
    public static final int TYPE_CODALNUM = 5;
    public static final int TYPE_CODNUM   = 6;
    public static final int TYPE_BOOLEAN  = 7;
    
    //private int TYPE = 0; // Tipo di input
    //private int MAXLEN = 0; // Lunghezza massima

    //private boolean REQUIRED = false;
    
    private String DEFAULT_VALUE = ""; // Il valore di default dell'oggetto
    
    private boolean UPPERCASE = false;
    private boolean LOWERCASE = false;
    private int DECIMAL = 0;// Idica il numero di cifre decimali
    
    private boolean ONREQUIREDALLOWUP = false; // Per default in un campo REQUIRED, non permetto di spostarsi sul campo predente
    
    static public boolean CHECK_FOCUS_LOST = true;

    private float _MAX = 0;
    private float _MIN = 0;
    
    class myPanel extends JPanel {
        java.awt.Image image = null;
        @Override
        public void paint(java.awt.Graphics g)
        {
            g.drawImage(image, 0, 0, this);
        }
    
        public myPanel()
        {
            javax.swing.ImageIcon ico = new javax.swing.ImageIcon(getClass().getResource("/our/gui/img/required.gif"));
            image = ico.getImage();
            setBounds(0, 0, 9, 9);
            setVisible(true);
        }
    }
    
    /**
     * Ritorna il testo formattato
     * @return testo inserito nel campo
     */
    @Override
    public String getText()
    {
        if(isDate())
            return super.getText().replace("/", "");

        if(getCharsInputAllowed()==TYPE_NUMERIC && DECIMAL>0)
        {
            //return super.getText().replaceAll(",", ".");
            String bRet = "" + our.gui.utils.StringToDouble(super.getText());
            if(bRet.endsWith(".0")) bRet = bRet.substring(0, bRet.length()-2) + ",0";
            return bRet;
        }
            
        return super.getText();
    }

    private String getTextOriginal()
    {
        return super.getText();
    }

    /**
     * Permette di modificare il set di caratteri ammessi in input
     * @param TYPE TYPE_DATA, TYPE_ALFANUM ecc ecc
     */
    /*public void setInputType(int TYPE)
    {
        this.TYPE = TYPE;
    }

    /**
     * Restituisce il tipo di input accettato dal campo
     * @return un 'tipo' riconosciuto dal campo
     */
    /*public int getInputType()
    {
        return TYPE;
    }*/
    
    @Override
    public void setText(String str)
    {
        try {
            switch(getCharsInputAllowed())
            {
                case TYPE_NUMERIC:
                    if( str.length()>0 && DECIMAL>0)
                    {
                        super.setText(our.gui.utils.StringLikeDouble(str, DECIMAL));
                    } else {
                        super.setText(str);
                    }
                    break;
                case TYPE_DATA:
                    if(str==null) break;
                    if(str.isEmpty())
                    {
                        super.setText("");
                        break;
                    }
                    String date = str.replace("/", ""); // Per retrocompatibilita (Gestione Fatture)
                    // L'ultimo parametro serve per retrocompatibilità
                    if(date.length()==4 || date.length()==6 || date.length()==8)
                    {
                        date = date.substring(0, 2) + "/" + date.substring(2, 4) + "/" + date.substring(4);
                        super.setText(date);
                    }
                    break;
                default:
                {
                    super.setText(str);
                    if(isEnabled()==false) super.setCaretPosition(0);
                }
            }
        } catch(java.lang.StackOverflowError soe) {
        } catch(java.lang.NumberFormatException nfe) {
            setText("");
        }
        if( (SETTINGS.isZoom()) && (str!=null) && 
            (str.length()>0) && (getFieldShowObj()!=null) && (getFieldShowIdZoomCol()>=0) )
        {
            SETTINGS.callZoom(str, true);
            /*if( (getFieldShowObj()!=null) && (getFieldShowIdZoomCol()>=0) )
            {*/
                ourLabel lbl = getFieldShowObj();
                lbl.setText(SETTINGS.fillObj(getFieldShowIdZoomCol()));
            //}
        } else {
            if( (getFieldShowObj()!=null) && (getFieldShowIdZoomCol()>=0) )
            {
                ourLabel lbl = getFieldShowObj();
                lbl.setText("");
            }
        }
    }

    public void setTextOriginal(String strText)
    {
        super.setText(strText);
    }
    
    /**
     * public setDecimal(int iDecNum)
     * Imposta il numero di decimali accettati
     * @param iDecNum Numero di decimali massimo
     */
    public void setDecimal(int iDecNum)
    {
        if(getCharsInputAllowed()==TYPE_NUMERIC)
            DECIMAL = iDecNum;
    }

    /**
     * public void setRangeValues(float fMax, float fMin)
     * Imposta un range di valori per l'inserimento
     * fMax Massimo valore ammissibile
     * fMin Minimo valore ammissibile
     *
     */
    public void setRangeValues(float fMax, float fMin)
    {
        _MAX = fMax;
        _MIN = fMin;
    }
    
    /**
     * Restituisce se il campo è di tipo data
     * @return true se è di tipo data, false altrimenti
     */
    public boolean isDate()
    {
        return getCharsInputAllowed()==TYPE_DATA;
    }
    
    /**
     * Restituisce se il campo è obbligatorio
     * @return true se è obbligatorio, false altrimenti
     */
/*    public boolean isRequired()
    {
        return REQUIRED;
    }*/
    
    public ourTextField()
    {
        super();
        init();

        // Diabilito l'oggetto per default
        setEnabled(false);
        // Imposto il font
        setFont(SETTINGS.getEntryFieldFont());
        // Imposto l'altezza dell'oggetto (non funge)
        setSize(getWidth(), SETTINGS.getOurHeight());
        // Aggiungo i listener per il fuoco
        addFocusListener(new java.awt.event.FocusAdapter() {
            @Override
            public void focusGained(java.awt.event.FocusEvent evt) {
                thisFocusGained(evt);
            }
            @Override
            public void focusLost(java.awt.event.FocusEvent evt) {
                thisFocusLost(evt);
            }
        });
        // Aggiungo i listeneres per la tastiera
        addKeyListener(new java.awt.event.KeyAdapter() {
            @Override
            public void keyTyped(java.awt.event.KeyEvent evt) {
                KeyTyped(evt);
            }
            @Override
            public void keyPressed(java.awt.event.KeyEvent evt) {
                if(evt.getKeyChar()==java.awt.event.KeyEvent.VK_ESCAPE)
                    SETTINGS.setEscKeyPressed(true);
            }
            @Override
            public void keyReleased(java.awt.event.KeyEvent evt) {
                if(SETTINGS.isEscKeyPressed())
                    SETTINGS.setEscKeyPressed(false);
            }
        });
    }
    
    public ourTextField(int MAXLEN, int TYPE, boolean REQ)
    {
        super();
//        this.MAXLEN = MAXLEN;
//        this.TYPE = TYPE;
//        this.REQUIRED = REQ;
        init();

        // Imposto il messaggio di help
//        SETTINGS.setHelpMsg(getHelpMsg());
        // Diabilito l'oggetto per default
        setEnabled(false);
        // Imposto il font
        setFont(SETTINGS.getEntryFieldFont());
        // Imposto l'altezza dell'oggetto (non funge)
        setSize(getWidth(), SETTINGS.getOurHeight());
        // Se l'oggetto è di tipo numerico l'allineamento lo imposto a destra
        if(this.getCharsInputAllowed()==TYPE_CODNUM || this.getCharsInputAllowed()==TYPE_NUMERIC)
            setHorizontalAlignment(javax.swing.JTextField.RIGHT);
        
        if(this.getCharsInputAllowed()==TYPE_CODALNUM) // Se è un codice imposto in maiuscolo
            setUppercase(true);


        // Aggiungo i listener per il fuoco
        addFocusListener(new java.awt.event.FocusAdapter() {
            @Override
            public void focusGained(java.awt.event.FocusEvent evt) {
                thisFocusGained(evt);
            }
            @Override
            public void focusLost(java.awt.event.FocusEvent evt) {
                thisFocusLost(evt);
            }
        });

        
        // Aggiungo i listeneres per la tastiera
        addKeyListener(new java.awt.event.KeyAdapter() {
            @Override
            public void keyTyped(java.awt.event.KeyEvent evt) {
                KeyTyped(evt);
            }
            @Override
            public void keyPressed(java.awt.event.KeyEvent evt) {
                if(evt.getKeyChar()==java.awt.event.KeyEvent.VK_ESCAPE)
                    SETTINGS.setEscKeyPressed(true);
            }
            @Override
            public void keyReleased(java.awt.event.KeyEvent evt) {
                if(SETTINGS.isEscKeyPressed())
                    SETTINGS.setEscKeyPressed(false);
            }
        });

        // Quando cambia lo stato (enabled true/false) se ha lo zoom, applico la stessa proprietà
        /*addPropertyChangeListener(new java.beans.PropertyChangeListener() {
            @Override
            public void propertyChange(java.beans.PropertyChangeEvent evt) {
                if(SETTINGS.isFieldInKeyFrame()==true)
                    SETTINGS.setButZoomEnabled((java.lang.Boolean)evt.getNewValue());
            }
        });*/
    }
    
    /**
     * public void setOnRequiredAllowUp(boolean bAllow)
     * @param bAllow true se in un campo REQUIRED permetti la pressione del tasto UP, false altrimenti
     */
    public void setOnRequiredAllowUp(boolean bAllow)
    {
        ONREQUIREDALLOWUP = bAllow;
    }
    
    /**
     * Imposto il valore di default del campo
     * @param str
     */
    public void setDefaultValue(String str)
    {
        DEFAULT_VALUE = str;
    }
    
    private void thisFocusGained(java.awt.event.FocusEvent evt) {
        //if(SETTINGS.getIsZoom()) SETTINGS.enableZoomButton(true);
        if(this.getCharsInputAllowed()==TYPE_CODNUM || this.getCharsInputAllowed()==TYPE_NUMERIC)
            setHorizontalAlignment(javax.swing.JTextField.RIGHT);

        if(this.getCharsInputAllowed()==TYPE_CODALNUM) // Se è un codice imposto in maiuscolo
            setUppercase(true);
        
        SETTINGS.enableZoomButton(SETTINGS.getIsZoom());

        if(getCharsInputAllowed()==TYPE_NUMERIC)
        {
            String strTmp = super.getText();
            strTmp = strTmp.replaceAll("\\.", "");
            if(strTmp.indexOf(",")>=0) // Se ci sono cifre decimali
            {
                boolean bBreak = false;
                while( (strTmp.endsWith("0")) || (strTmp.endsWith(",")) ) // Elimino tutti gli zeri in coda
                {
                    if(strTmp.endsWith(",")) bBreak = true; // Per i casi 1000,00 che altrimenti diventerebbe 1,00
                    strTmp = strTmp.substring(0, strTmp.length()-1);
                    if(bBreak) break;
                }

            }
            super.setText(strTmp);
        }

        if(getCharsInputAllowed()==TYPE_DATA)
        {
            String strData = getText();
            super.setText(strData);
        }
        
        // Uso il costrutto try-catch perchè se sono in una form non standard(formDBConnection)
        // e non ho la statusbar viene lanciata una eccezione
        try {
            if( (this.getHelpMsg()==null) || (this.getHelpMsg().length()==0) )
                our.gui.ourForm.updateStatusHelp("");
            else
                our.gui.ourForm.updateStatusHelp(SETTINGS.getHelpMsg());
        } catch (NullPointerException npe) { }
        // Questo controllo serve per evitare che quando il campo prendo il fuoco in particolari
        // condizioni, non venga evidenziato il contenuto
        if(our.gui.ourTextField.CHECK_FOCUS_LOST==true)
            selectAll();
    }

    /**
     * Questa funzione disabilita la gestione del mouse del campo ourTextField e in caso di MOUSE_CLICKED richiama
     * la funzione di gestione del parent: ourTextField
     * @param e
     */
    @Override
    protected void processMouseEvent(java.awt.event.MouseEvent e)
    {
        boolean bConsumeEvent = true;
        if(SETTINGS.getOurForm()!=null)
        {
            if(e.paramString().indexOf("MOUSE_CLICKED")>=0)
            {
                if(hasFocus() || isEnabled()==false)
                {
                    e.consume();
                } else {
                    bConsumeEvent = !(SETTINGS.getOurForm().clickOnComponent(this));
                }
            }
            if(bConsumeEvent)
            {
                e.consume();
            } else {
                requestFocus();
                super.processMouseEvent(e);
            }
        } else if(e.paramString().indexOf("MOUSE_CLICKED")>=0) {
            requestFocus();
            super.processMouseEvent(e);
        }
    }

    /**
     * Imposta il contenuto del campo al valore di default
     */
    public void reset()
    {
        setText(DEFAULT_VALUE);
        selectAll();
    }
    
    
    public void thisFocusLost(java.awt.event.FocusEvent evt) {
        // 15/04/2009
        //if(our.gui.ourTextField.AVOID_CHECK) return;
        // Disabilito il pulsante zoom se presente
        if(SETTINGS.getIsZoom()) SETTINGS.enableZoomButton(false);
        // Deselziono il tutto
        select(0,0);

        /** QUESTO CODICE E' NUOVO ED E' DA TESTARE **/
        if( (getCharsInputAllowed()==TYPE_NUMERIC) && (getTextOriginal().length()>0) && DECIMAL>0)
        {
            super.setText(our.gui.utils.StringLikeDouble(super.getText(), DECIMAL));
        }

        if( (getCharsInputAllowed()==TYPE_NUMERIC) && (getTextOriginal().length()==0) &&
            (DECIMAL>0) && (SETTINGS.getOurForm()!=null && SETTINGS.getOurForm().getUserMode()!=ourForm.MODE_VIS) )
        {
            super.setText(our.gui.utils.StringLikeDouble("0", DECIMAL));
        }
        
        // Se il campo è di tipo data, lo formatto come data
        if(getCharsInputAllowed() == TYPE_DATA) {
            String date = isValidDate(getText());
            if(date!=null)
            {
                date = date.substring(0, 2) + "/" + date.substring(2, 4) + "/" + date.substring(4);
                setText(date);
            }
        }
    }
    
    /**
     * Converte ogni caratettere digitato in maiuscolo
     * @param UPPERCASE true se voglio convertire ogni carattere in maiuscolo
     *                  false altrimenti
     */
    public void setUppercase(boolean UPPERCASE)
    {
        this.UPPERCASE = UPPERCASE;
    }
    
    /**
     * Converte ogni caratettere digitato in maiuscolo
     * @param LOWERCASE true se voglio convertire ogni carattere in maiuscolo
     *                  false altrimenti
     */
    public void setLowercase(boolean LOWERCASE)
    {
        this.LOWERCASE = LOWERCASE;
    }

    public void showAsterisk()
    {
        /*myPanel pnlIco = new myPanel();
        getParent().add(pnlIco);
        pnlIco.setBounds(getX() - 10, getY() + 5, 9, 9);
        pnlIco.setToolTipText("Campo obbligatorio");*/
        showAsterisk(getParent());
    }

    public void showAsterisk(Container CONT)
    {
        if(this.isWithStar())
        {
            myPanel pnlIco = new myPanel();
            CONT.add(pnlIco);
            pnlIco.setBounds(getX() - 10, getY() + 5, 9, 9);
            pnlIco.setToolTipText("Campo obbligatorio");
        }
    }

    private void init()
    {
        // Disabilito il gestore standard degli eventi1
        setFocusTraversalKeysEnabled(false);
        
        // Imposto la tooltip del campo
        switch(getCharsInputAllowed())
        {
            case TYPE_DATA:
                setToolTipText("Inserisci la data nel formato ggmmaaaa o ggmmaa");
                break;
        }
    }
    
    // Questa funzione 'forza' la formattazione di un campo.
    // Deve essere chiamata quando in campo (principalmente) numerico (double) viene
    // settato il testo. In MySQL le cifre decimali nulle non vengono memorizzate quindi
    // con questa funzione si setta la formattazione del campo.
    public void ForceFormatField()
    {
        if(getCharsInputAllowed()==TYPE_NUMERIC)
        {
            // Se la lunghezza del testo è 0, imposto 0 come valore
            setText("0");
            // Formatto il testo
            NumberFormat formatter = null;
            if(DECIMAL==0)
            {
                formatter = new DecimalFormat("##");
            } else {
                String strFormatter = "#.";
                for(int i=0; i<DECIMAL; i++) strFormatter += "0";
                    formatter = new DecimalFormat(strFormatter);
            }
            setText(formatter.format(Double.parseDouble(getText().replace(",", "."))));
            // Per evitare che vengano considerati valori del tipo ,05 ,10 controllo se 
            // il primo carattere è una virgola ,
            if(getText().charAt(0)==',')
            {
                String strTmp = "0" + getText();
                setText(strTmp);
            }
        }
    }
   
    // L'utente ha premuto un tasto
    private void KeyTyped(java.awt.event.KeyEvent evt) {
        // TODO add your handling code here:
        if(UPPERCASE)
             evt.setKeyChar( Character.toUpperCase(evt.getKeyChar()) );

        if(LOWERCASE)
             evt.setKeyChar( Character.toLowerCase(evt.getKeyChar()) );
            
        if(CHARS_ARRAY[getCharsInputAllowed()].indexOf(evt.getKeyChar())>=0)
        {
            if(super.getSelectionStart()==0 && super.getSelectionEnd()==this.getMaxTextLength() && (int)evt.getKeyChar()!=13)
            {
                super.setText("");
            }
            if(super.getText().length()>=this.getMaxTextLength())
                evt.consume();
            // Se il campo è di tipo numerico, controllo se è presenta la virgola e in caso affermativo
            // verifico che il numero delle cifre decimali non sia stata superata
            if( (getCharsInputAllowed()==TYPE_NUMERIC) && ((getTextOriginal().indexOf(","))>=0) )
            {
                String str = getTextOriginal().substring(getTextOriginal().indexOf(","));
                if((str.length()-1)>=DECIMAL) evt.consume();
            }
            // Se il campo è un numerico e premo il pulsante '.' 
            // lo trasformo in ','.
            if( (getCharsInputAllowed()==TYPE_NUMERIC) && (evt.getKeyChar()=='.') )
            {
                evt.setKeyChar(',');
            }

            // Se TYPE=TYPE_NUMERIC annullo l'evento se è già presente una virgola
            if( (getCharsInputAllowed()==TYPE_NUMERIC) && (evt.getKeyChar()==',') && ((getTextOriginal().indexOf(","))>=0) ) evt.consume();
        } else {
            // Se il tasto premuto è stampabile (lettara, numero, simbolo)
            // ma non appartiene alla sequenza accettata, rigetta il carattere
            int iKeyCode = (int)evt.getKeyChar();
            if( (iKeyCode>=32) && (iKeyCode<=255) )
            {
                evt.consume();
            }
        }
    }

    /**
     * Verifica che la data passata in formato Stringa di 4,6,8 caratteri, sia valida
     * @param aDate Data da verificare
     * @return La data formattata correttamente, null altrimenti
     */
    private String isValidDate(String aDate)
    {
        aDate = aDate.replaceAll("/", "");
        java.util.Calendar cal = java.util.Calendar.getInstance();
        int year = cal.get(java.util.Calendar.YEAR);
        if (aDate.length() == 6) {
            year = year / 100;
            aDate = aDate.substring(0, 4) + year + aDate.substring(4);
        }
        if(aDate.length() == 4) {
            aDate += year;
        }
        SimpleDateFormat sdf = null;
        if (aDate.length() == 8) {
            sdf = new SimpleDateFormat("ddMMyyyy");
        } else {
            sdf = new SimpleDateFormat("ddMMyy");
        }
        Date testDate = null;

        try {
            testDate = sdf.parse(aDate);
        } catch (java.text.ParseException e) {
            return null;
        }
        if (!sdf.format(testDate).equals(aDate)) {
            return null;
        }
        return aDate;
    }
    
    public boolean ISVALID(boolean bShowErrorMessage) {
        boolean bRet = true;

        switch(getCharsInputAllowed())
        {
            case TYPE_DATA:
                if( (getText().length()>0) && (isValidDate(getText())==null) )
                {
                    javax.swing.JOptionPane.showMessageDialog(null, "Hai inserito una data non valida", "ERRORE", javax.swing.JOptionPane.ERROR_MESSAGE);
                    bRet = false;
                }
                break;
            case TYPE_CODNUM:
            case TYPE_NUMERIC:
                if(_MAX!=_MIN)
                {
                    javax.swing.JOptionPane.showMessageDialog(null, "I valori ammessi sono nell'intervallo " + _MIN + " - " + _MAX + "!", "ERRORE", javax.swing.JOptionPane.ERROR_MESSAGE);
                    bRet = false;
                }
                break;
        }
        if(bRet) // Se bRet=true non ci sono stati controlli con esito negativo, controllo ora SOLO se il campo è ebbligatorio
        {
            if( (this.isWithStar()) && (getText().length()==0) )
            {
                bRet = false;
                javax.swing.JOptionPane.showMessageDialog(null, "Campo obbligatorio", "ERRORE", javax.swing.JOptionPane.ERROR_MESSAGE);
            }
        }
        // Se il campo è uno zoom è c'è del testo, verifico che il valore inserito, esista realmente
        // Aggiungo la condizione di essere abilitato altrimenti quando sono in inserimento di un nuovo record
        // si bloccherebbe sempre la procedura poichè non troverebbe nella tabella il valore corrispondente visto che lo stiamo inserendo
        // in questo momento.
        if( (SETTINGS.getIsZoom()) && (getText().length()>0) && isEnabled() )
        {
            String s[] = SETTINGS.callZoom(getText(), true);
            bRet = (s==null) ? false : true;
            if(SETTINGS.isZoomOnZoom() && s==null)
            {
                our.gui.utils.MessageBox("Non ci sono campi con il parametro richiesto!", JOptionPane.INFORMATION_MESSAGE);
            } else if(s==null) {
                our.gui.utils.MessageBox("Non ci sono campi con il parametro richiesto!", JOptionPane.INFORMATION_MESSAGE);
            }
        } else if( (SETTINGS.getIsZoom()) && (getText().length()==0) ) {
            SETTINGS.fillObj(true);
        }
        return bRet;
    }
}
